package br.com.fiap.sas.managedbean;

import java.sql.SQLException;
import java.util.Date;

import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

import br.com.fiap.sas.bean.Favorecido;
import br.com.fiap.sas.bean.Movimentacao;
import br.com.fiap.sas.dao.FavorecidoDAO;
import br.com.fiap.sas.dao.MovimentacaoDAO;

@ManagedBean
public class TransferenciaMB {

	private Double valor;
	private String descricao;
	private String agendada;
	private Favorecido favorecido = new Favorecido();
	private Date agendamento;
	private String senhaDigitada;
	
	public TransferenciaMB(){
		agendamento = new Date();
	}
	
	public Date getAgendamento() {
		return agendamento;
	}
	public void setAgendamento(Date agendamento) {
		this.agendamento = agendamento;
	}
	public Double getValor() {
		return valor;
	}
	public void setValor(Double valor) {
		this.valor = valor;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String getAgendada() {
		return agendada;
	}
	public void setAgendada(String agendada) {
		this.agendada = agendada;
	}
	public Favorecido getFavorecido() {
		return favorecido;
	}
	public void setFavorecido(Favorecido favorecido) {
		this.favorecido = favorecido;
	}
	public String realizarTransferencia(){
		FacesContext facesContext = FacesContext.getCurrentInstance();	
		CorrentistaMB cmb = (CorrentistaMB)	facesContext.getExternalContext().getSessionMap().get("correntistaMB");
		valor = valor * -1;
		
		try {
			if(cmb.getCorrentista().getAgenciaConta().getCodigoContaPai() == 0)
				favorecido=FavorecidoDAO.getFavorecido(favorecido.getCodigo(),cmb.getCorrentista().getCodigo());
			else{
				favorecido = new Favorecido();
				favorecido.setCodigo(cmb.getCorrentista().getAgenciaConta().getCodigoContaPai());
				favorecido.setNome(cmb.getCorrentista().getNomeExibicao() + " - C/C");
				favorecido.setCodigoCorrentista(cmb.getCorrentista().getCodigo());
				favorecido.setNumeroBanco("720");
			}
		} catch (SQLException e1) {
			System.out.println("Erro ao preencher Favorecido pelo ID: " + e1.getMessage());
			return "erro";
		}
		
		Movimentacao movimentacao = new Movimentacao();
		movimentacao.setValor(valor);
		movimentacao.setTipoMovimentacao("TRANSFERENCIA");
		movimentacao.setDescricao(descricao);
		movimentacao.setCodigoFavorecido(favorecido.getCodigo());
		movimentacao.setCodigoOrigem(cmb.getCorrentista().getAgenciaConta().getCodigo());
		if(cmb.getCorrentista().getAgenciaConta().getCodigoContaPai() > 0)
			movimentacao.setCodigoDestino(favorecido.getCodigo());
		else
			if(favorecido.getNumeroBanco().equals("720")){
				try {
					movimentacao.setCodigoDestino(FavorecidoDAO.getCodigoInterno(favorecido.getNumeroAgencia(), favorecido.getNumeroConta()));
				} catch (SQLException e) {
					System.out.println("Erro ao receber codigo interno do Favorecido: " + e.getMessage());
					return "erro";
				}
			}
			
		if(agendada.equals("hoje")) {
			try {
				MovimentacaoDAO.incluirMovimentacaoDia(movimentacao);
				if(movimentacao.getCodigoDestino() != null)
				{
					movimentacao.setValor(valor*-1);
					movimentacao.setCodigoOrigem(movimentacao.getCodigoDestino());
					movimentacao.setCodigoDestino(null);
					MovimentacaoDAO.incluirMovimentacaoDia(movimentacao);
				}
				return "transferenciaFinalizada";
			} catch (Exception e) {
				System.out.println("Erro ao incluir Transferencia: " + e.getMessage());
				return "erro";
			}
		}else{
			try {
				movimentacao.setDataHoraEfetivacao(agendamento);
				movimentacao.setVencimento(agendamento);
				MovimentacaoDAO.incluirMovimentacaoAgendamento(movimentacao);
				return "agendamentoTransferenciaFinalizado";
			} catch (Exception e) {
				System.out.println("Erro ao incluir Transferencia Agendada: " + e.getMessage());
				return "erro";
			}
		}
	}
	public String getSenhaDigitada() {
		return senhaDigitada;
	}
	public void setSenhaDigitada(String senhaDigitada) {
		this.senhaDigitada = senhaDigitada;
	}
}